package kr.co.bettersoft.sendme.activity;

import java.util.ArrayList;
import java.util.List;

import kr.co.bettersoft.sendme.provider.SendMeBlock;
import kr.co.bettersoft.sendme.provider.SendMeBlockAdapter;
import kr.co.bettersoft.sendme.provider.SendMeFriend;
import kr.co.bettersoft.sendme.provider.SendMeInstall;
import kr.co.bettersoft.sendme.provider.SendMeLog;
import kr.co.bettersoft.sendme.provider.SendMeReceiveMessageAdapter;
import kr.co.bettersoft.sendme.rest.SendMeAudioMessageRest;
import kr.co.bettersoft.sendme.rest.SendMeBlockRest;
import kr.co.bettersoft.sendme.rest.SendMeLogRest;
import kr.co.bettersoft.sendme.util.SendMeActivityManager;
import kr.co.bettersoft.sendme.util.SendMeCommon;
import kr.co.bettersoft.sendme.util.SendMeConstant;
import kr.co.bettersoft.sendme.util.SendMeDBManagerInstallUser;
import kr.co.bettersoft.sendme.activity.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;

/**
 *  차단한사용자 목록을 불러온다.
 *    차단 해제 버튼을 눌러 차단을 해제할 수 있다.
 *   
 * @author blue
 *
 */
public class SendMeBlockListActivity extends ListActivity implements OnScrollListener {

	public static String TAG = SendMeBlockListActivity.class.getSimpleName();

	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();

	// 마스터 암호.
	private String MASTER_PASSWORD = "";

	// 퍼블릭 암호.
	private String PUBLIC_PASSWORD = "";

	// 기능 모드.(MASTER/PUBLIC)
	private String FUNCTION_MODE = "";

	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";

	// 리스트에서 클릭한 버튼이 위치한 포지션
//	int selectedPosition;
	// 리스트에서 선택한 항목
	SendMeBlock selectedItem;

	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;

	// 프로그래스바(로딩 표시)
	private ProgressDialog dialog;
	

	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 앱을 종료 한다.
	private static final int ALERT_DIALOG_EXIT_ID = 101;

	// 서버에서 받은 차단 목록을 조회한다
	private static final int THREAD_SELECT_BLOCK_LIST = 102;		

	// 조회한 차단 리스트를 화면에 세팅한다
	private static final int THREAD_SHOW_BLOCK_LIST = 103;

	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 105;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 106;

	// 사용자를 차단 해제할지 확인 받는다
	private static final int THREAD_CONFIRM_UPDATE_BLOCK_USER = 107;
	// 사용자 차단을 해제한다
	private static final int THREAD_UPDATE_BLOCK_USER = 108;
	
	// 토스트 - 차단을 해제하였습니다.
	private static final int THREAD_TOAST_UPDATE_BLOCK_SUCCESS = 112;
	// 토스트 - 차단 해제 요청이 실패하였습니다.
	private static final int THREAD_TOAST_UPDATE_BLOCK_FAIL = 113;
	
	
	
	// 차단 유저 목록 어댑터 클래스.
	private SendMeBlockAdapter sendMeBlockAdapter;		

	// 차단 유저 목록
	private ArrayList<SendMeBlock> sendMeBlockList = null;		

	// 리스트 없음 표시
	View emptyListView;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);

		setContentView(R.layout.activity_send_me_block_list);

		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);

		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);

		// 설정파일을 가져 온다.
		this.confirmNotification();

		
		// 뒤로 가기 화살표 버튼을 설정 한다.
		imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
		imageButtonTopBack.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeBlockListActivity.this);
				finish();
			}
		});

		// 타이틀바의 메인 메뉴 버튼을 설정 한다.
		imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
		imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "pressed top main menu.");

				// 메인 메뉴 화면을 출력 한다.
				Intent i = new Intent(SendMeBlockListActivity.this, SendMeMainMenuActivity.class);
				startActivity(i);
				
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeBlockListActivity.this);
				finish();
			}
		});

		
		
		// 화면 출력을 위한 차단 유저 목록을 생성 한다.
		sendMeBlockList = new ArrayList<SendMeBlock>();

		// 친구 어댑터를 생성 한다.
		sendMeBlockAdapter = new SendMeBlockAdapter(getApplicationContext(), this, sendMeBlockList);

		// 리스트 없음 표시
		emptyListView = findViewById(R.id.emptyListView);
		
		// list view 의 cursor 를 제공하기 위해서 어댑터를 세팅 한다.
		setListAdapter(sendMeBlockAdapter);

		// 스크롤 이벤트 리스너를 등록 한다.
		getListView().setOnScrollListener(this);

		// list 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);

		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
			
		
		Log.d(TAG,"FUNCTION_MODE:"+FUNCTION_MODE);
		// 퍼블릭 모드에서는 차단 목록을 볼 수 없음.
		if(FUNCTION_MODE.equals("PUBLIC")){
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_BLOCK_LIST));		
		}else{
			// 서버에서 차단 리스트를 조회한다
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_BLOCK_LIST));		// SELECT_TEMP_MESSAGE_LIST		SHOW_TEMP_MESSAGE_LIST
		}
		
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.send_me_friend, menu);
		return true;
	}

	/**
	 * 필요한 핸들러를 등록해서 사용한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
			case ALERT_DIALOG_EXIT_ID : 
				break;
				// 차단 유저 목록을 세팅
			case THREAD_SELECT_BLOCK_LIST : 
				threadSelectBlockList();
				break;
				// 차단 유저 목록을 출력 한다.		
			case THREAD_SHOW_BLOCK_LIST : 
				runOnUiThread(showBlockList);
				break;
				// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
					dialog.show();
				break;
				// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				dialog.hide();
				break;
				
				// 사용자 차단 해제 확인
			case THREAD_CONFIRM_UPDATE_BLOCK_USER : 
				runOnUiThread(confirmUpdateBlockUser);		
				break;
				// 사용자 차단 해제 
			case THREAD_UPDATE_BLOCK_USER : 
				threadUpdateBlockUser();
				break;
				
				// 토스트 - 차단 해제 성공
			case THREAD_TOAST_UPDATE_BLOCK_SUCCESS : 
				showToastUpdateBlockUserSuccess();
				break;
				// 토스트 - 차단 해제 실패
			case THREAD_TOAST_UPDATE_BLOCK_FAIL : 
				showToastUpdateBlockUserFail();
				break;
								
			}
		}
	};


	/**
	 * 목록을 세팅해서 출력 한다.
	 */
	private Runnable showBlockList = new Runnable() {

		@Override
		public void run() {
			// TODO Auto-generated method stub		 SendMeBlockAdapter 
			if(sendMeBlockList!=null){
				sendMeBlockAdapter = new SendMeBlockAdapter(returnThis(), SendMeBlockListActivity.this, sendMeBlockList);
				getListView().setAdapter(sendMeBlockAdapter);
			}
			
			if(sendMeBlockList.size()>0){
				emptyListView.setVisibility(View.GONE);
			}else{
				emptyListView.setVisibility(View.VISIBLE);
			}
		}
	};



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 확인창.
	/**
	 * 차단 해제 전 확인 창을 띄운다
	 * 
	 */
	private Runnable confirmUpdateBlockUser = new Runnable() {		
		@Override
		public void run() {

			new AlertDialog.Builder(SendMeBlockListActivity.this)
			.setTitle("차단 해제")
			.setMessage("해당 사용자의 차단을 해제하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_BLOCK_USER));
				}
			}).show();

		}
	};
	
	// 토스트
	/**
	 * 차단 해제 성공했다는 toast 를 띄운다.
	 */
	public void showToastUpdateBlockUserSuccess() {					
		CharSequence text = "해당 사용자를 차단해제하였습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 * 차단 해제 실패했다는 toast 를 띄운다.
	 */
	public void showToastUpdateBlockUserFail() {					
		CharSequence text = "차단 해제 요청이 실패하였습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// 리스트에 있는 버튼 클릭시 실행될 메소드

	// 차단 해제 버튼 확인창을 띄우고 차단해제한다
	public void updateBlockUser(SendMeBlock sendMeBlock){
		// 선택된 포지션 저장
		selectedItem = sendMeBlock;
		
		// 확인창
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_UPDATE_BLOCK_USER));
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버 통신

	/**
	 * 차단 유저 목록을 가져온다				 
	 */
	public void threadSelectBlockList() {

		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));

		Thread thread = new Thread(new Runnable() {

			public void run() {
//				
				SendMeBlock sendMeBlock = new SendMeBlock();
				
				sendMeBlock.setActivateYn("Y");
				sendMeBlock.setSendMeMemberPhoneNumber(PHONE_NUMBER);
				
				SendMeBlockRest sendMeBlockRest = new SendMeBlockRest();

//				List<SendMeBlock> result = sendMeBlockRest.selectBlockList(sendMeBlock);	
				sendMeBlockList = sendMeBlockRest.selectBlockList(sendMeBlock);	
				
//				SendMeDBManagerInstallUser sendMeDBManagerInstallUser = new SendMeDBManagerInstallUser(returnThis());			
//				ArrayList<SendMeFriend> phoneBookAddress = sendMeDBManagerInstallUser.selectInstallUserData();
				
				
				for(int i=0; i<sendMeBlockList.size(); i++){

					SendMeBlock tempSendMeBlock = sendMeBlockList.get(i);
					
					if(tempSendMeBlock.getNickName()==null || tempSendMeBlock.getNickName().length()<1 ){
						sendMeBlockList.get(i).setNickName("미상");
					}
					
//					// 초기화
//					sendMeBlockList.get(i).setUserName("");
//					
//					// 전화번호부와 동기화하여 이름 세팅
//					for(int j=0; j<phoneBookAddress.size(); j++){
//
//						// 번호가 같으면 sqlite 전화번호부의 닉네임(없으면 이름)으로 세팅
//						if(tempSendMeBlock.getPhoneNumber().equals(phoneBookAddress.get(j).getPhoneNumber())){
//							if(phoneBookAddress.get(j).getNickName().length()>0){
//								sendMeBlockList.get(i).setUserName(phoneBookAddress.get(j).getNickName());
//							}else{
//								sendMeBlockList.get(i).setUserName(phoneBookAddress.get(j).getName());
//							}
//						}
//					}
				}

				// 화면에 출력
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_BLOCK_LIST));	
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
			}
		});
		thread.start();
	}
	
	
	/**
	 * 사용자를 차단해제한다		
	 */
	public void threadUpdateBlockUser() {
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {
			
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeBlock sendMeBlock = new SendMeBlock();
				
//				SendMeBlock sendMeBlock2 = sendMeBlockList.get(selectedPosition);
				SendMeBlock sendMeBlock2 = selectedItem;
				// 차단 대상 전화번호  
				String blockUserNumber = sendMeBlock2.getPhoneNumber();
				
				sendMeBlock.setPhoneNumber(blockUserNumber);				// 너
				sendMeBlock.setActivateYn("N");						// Y -> N 으로 바꿔서 차단 해제 
				sendMeBlock.setSendMeMemberPhoneNumber(PHONE_NUMBER);		// 나
				sendMeBlock.setModifyDate(nowTime);
				
				SendMeBlockRest sendMeBlockRest = new SendMeBlockRest();
				SendMeBlock result = sendMeBlockRest.updateBlock(sendMeBlock);
				
				if(result.getResult().equals("SUCCESS")){		
					// "차단해제하였습니다."
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_UPDATE_BLOCK_SUCCESS));
					
					// 목록 갱신을 위해 서버에서 차단 리스트를 다시 조회한다
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_BLOCK_LIST));			
				}else{
					// "차단 해제 실패했습니다."
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_UPDATE_BLOCK_FAIL));
				}
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			}
		});
		thread.start();
	}
	
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// 컨텍스트 반환
	public Context returnThis() {
		return this;
	}
	
	
	@Override
	public void onResume(){
		super.onResume();
		
		dialog = ProgressDialog.show(SendMeBlockListActivity.this, "", "Wait..", true);
		dialog.hide();
	}
	
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub

	}

	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);

		MASTER_PASSWORD = mSharedPreference.getString("master_password", "");
		PUBLIC_PASSWORD = mSharedPreference.getString("public_password", "");
		FUNCTION_MODE = mSharedPreference.getString("function_mode", "");
		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
	}

	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		sendMeActivityManager.removeActivity(this);
		finish();
	}
	@Override
	public void onStop(){
		super.onStop();
		dialog.dismiss();
	}
	
}